import axios from 'axios';
import { ElMessage } from 'element-plus';
import { nextTick } from 'vue';
import useUserStore from '@/stores/user.js';
import router from '@/router/index.js'; // 直接导入路由实例
import NProgress from 'nprogress'; // 引入进度条库
import 'nprogress/nprogress.css'; // 引入进度条样式

// 配置进度条选项
NProgress.configure({
	showSpinner: false, // 不显示旋转图标
	trickleSpeed: 200,  // 进度条加载速度
});

// 创建axios实例
const service = axios.create({
	baseURL: import.meta.env.VITE_BASE_API, // 从环境变量中获取API基础路径
	timeout: 5000, // 请求超时时间
	withCredentials: true // 跨域请求时是否携带cookie
});

// 请求拦截器
service.interceptors.request.use(
	config => {
		NProgress.start(); // 开始显示进度条

		const userStore = useUserStore();
		if(userStore.token?.token){
			config.headers['token'] = `Bearer ${userStore.token?.token}`
		}
		config.headers['tenant'] = import.meta.env.VITE_TENANT;
		return config;
	},
	error => {
		NProgress.done(); // 错误时结束进度条
		// 处理请求错误
		console.error('请求错误:', error);
		return Promise.reject(error);
	}
);

// 响应拦截器
service.interceptors.response.use(
	response => {
		NProgress.done(); // 响应成功时结束进度条
		// 处理响应数据
		const res = response.data;
		console.log(res.code)
		// 这里根据实际项目的返回格式进行判断
		if(!res.isSuccess){
			ElMessage({
				message: res.msg || '请求发生错误',
				type: 'error',
				duration: 3000
			});
			if(res.code == 40001){
				console.log('to  login')
				// 使用nextTick确保路由跳转在下一个事件循环中执行
				nextTick(() => {
					router.push('/login');
				});
			}
			return Promise.reject(new Error(res.msg || '请求失败'));
		}else{
			return res.data;
		}
	},
	error => {
		NProgress.done(); // 响应错误时结束进度条

		// 处理响应错误
		console.error('响应错误:', error);

		// 统一错误提示
		ElMessage({
			message: error.message || '请求发生错误',
			type: 'error',
			duration: 3000
		});

		return Promise.reject(error);
	}
);

/**
 * 发送请求的工具函数
 * @param {string} url - 请求URL
 * @param {string} method - 请求方法
 * @param {object} data - 请求数据
 * @param {object} config - 额外配置
 * @returns {Promise}
 */
const request = async (url, method = 'GET', data = {}, config = {}) => {
	try {
		// 可选：在单独请求中控制进度条
		if (!config.hideProgress) {
			NProgress.start();
		}

		const response = await service({
			url,
			method,
			[method.toUpperCase() === 'GET' ? 'params' : 'data']: data,
			...config
		});

		// 可选：在单独请求中控制进度条
		if (!config.hideProgress) {
			NProgress.done();
		}

		return response;
	} catch (error) {
		// 可选：在单独请求中控制进度条
		if (!config.hideProgress) {
			NProgress.done();
		}

		// 这里可以添加全局错误处理逻辑
		throw error;
	}
};

export default request;